/*
 * 功能：封装接口返回的数据，统一返回结果的包装类
 * 作者：张杨(Sunny)
 * 日期： 2024/10/21 11:05
 */
package com.example.springboot.common;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;


/**
 * Result类用于封装操作的结果，包括状态码、消息和数据
 */
@Data // Lombok注解：自动生成getter、setter、equals、hashCode、toString方法
@AllArgsConstructor // Lombok注解：自动生成包含所有字段的构造函数
@NoArgsConstructor // Lombok注解：自动生成无参构造函数
@Builder // Lombok注解：自动生成Builder模式的构造器
public class Result {

    public static final String CODE_SUCCESS = "200"; // 成功状态码
    public static final String CODE_AUTH_ERROR = "401"; // 认证错误状态码
    public static final String CODE_SYS_ERROR = "500"; // 系统错误状态码

    private String code; // 响应状态码，标识请求处理结果状态
    private String msg;  // 响应消息，描述请求处理结果的详细信息
    private Object data; // 响应数据，携带业务数据，可为任意类型


    /**
     * 创建一个表示成功的Result对象（不带数据）
     * 使用Builder模式构建对象
     *
     * @return 成功的Result对象，包含默认成功状态码和消息
     */
    public static Result success() {
        return Result.builder().code(CODE_SUCCESS).msg("请求成功").build();
    }


    /**
     * 创建一个包含数据的成功的Result对象
     * 使用全参构造函数直接创建对象
     *
     * @param data 要包含的业务数据，可以是任意对象
     * @return 包含数据的成功的Result对象
     */
    public static Result success(Object data) {
        return new Result(CODE_SUCCESS, "请求成功", data);
    }


    /**
     * 创建一个表示系统错误的Result对象
     * 使用默认的系统错误状态码(500)
     *
     * @param msg 错误消息，描述具体的错误信息
     * @return 错误的Result对象，包含系统错误状态码和自定义消息
     */
    public static Result error(String msg) {
        return new Result(CODE_SYS_ERROR, msg, null);
    }


    /**
     * 创建一个自定义错误状态码的Result对象
     * 允许调用者指定特定的错误码
     *
     * @param code 自定义错误状态码，如400, 403等
     * @param msg  错误消息，描述具体的错误信息
     * @return 自定义错误状态码的Result对象
     */
    public static Result error(String code, String msg) {
        return new Result(code, msg, null);
    }
}

